/*
 * @lc app=leetcode.cn id=387 lang=cpp
 *
 * [20] 表示数值的字符串
 */

// @lc code=start
class Solution
{
 public:
  bool isNumeric(char* str)
  {
    // 标记符号、小数点、e是否出现过
    bool sign = false, decimal = false, hasE = false;
    for (int i = 0; i < strlen(str); i++)
    {
      if (str[i] == 'e' || str[i] == 'E')
      {
        if (i == strlen(str) - 1) return false;  // e后面一定要接数字

        if (hasE) return false;  // 不能同时存在两个e
        hasE = true;
      }
      else if (str[i] == '+' || str[i] == '-')
      {
        // 第二次出现+-符号，则必须紧接在e之后
        if (sign && str[i - 1] != 'e' && str[i - 1] != 'E') return false;
        // 第一次出现+-符号，且不是在字符串开头，则也必须紧接在e之后
        if (!sign && i > 0 && str[i - 1] != 'e' && str[i - 1] != 'E') return false;
        sign = true;
      }
      else if (str[i] == '.')
      {
        // e后面不能接小数点，小数点不能出现两次
        if (hasE || decimal) return false;
        decimal = true;
      }
      else if (str[i] < '0' || str[i] > '9')  // 除了e，小数点，符号之外还有不合法字符
      {
        return false;
      }
    }
    return true;
  }
};
// @lc code=end
